<?php


namespace App\Process;


use App\Model\Setting\JobModel;
use EasySwoole\Component\Singleton;
use EasySwoole\Queue\Job;

class LmtJob
{
    use Singleton;
    
    /**
     * 创建推送任务
     * @param string $event Event中注册的事件名称
     * @param array $args 事件执行参数
     * $event执行结果返回格式 ['result' => true|false, 'message' => '时间执行结果返回信息,用于排查错误或备注']
     */
    public function createJob(string $event, array $args)
    {
        // 创建任务
        $job = new Job();
        // 获取队列
        $queue = LmtQueue::getInstance();
        //是否立即执行
        $_promptly = 1;
        if(isset($args['_promptly'])){
            $_promptly = 0;
            unset($args['_promptly']);
        }
        // 设置任务数据
        $jobData = [
            'event' => $event,
            'args' => $args
        ];
        /**记录任务信息*/
        $jobrecordData = [
            'job_id' => md5(json_encode($jobData)),
            'job_name' => $event,
            'job_data' => json_encode($args)
        ];
        if(JobModel::getOne(['job_id' => $jobrecordData['job_id']])){
            /**重复的任务不添加*/
            return True;
        }
        JobModel::insertData($jobrecordData);

        $job->setJobData($jobData);
        //如果不是立即执行,那么用
        if($_promptly == 0 || true) {
            // 设置任务重试次数为 5 次。任务如果没有确认，则会执行三次
            $job->setRetryTimes($args['retryTimes'] ?? 5);

            // 如果5秒内没确认任务，会重新回到队列。默认为3秒
            $job->setWaitConfirmTime($args['waitConfirmTime'] ?? 5);

            // 投递任务
            $queue->producer()->push($job);
        }
    }
}